package com.naihe.anderson.sms.application;

import java.lang.Thread.UncaughtExceptionHandler;

import android.content.Context;
import android.os.Handler;

import com.naihe.anderson.sms.util.FileUtil;

public class PhoneCrashHandler implements UncaughtExceptionHandler {

	public static final int MSG_WHAT_SHOW_THIS = 0;
	public static final int MSG_WHAT_ERROR_THIS = 1;
	Handler handler;
	
	/** 系统默认的UncaughtException处理类 */
	private Thread.UncaughtExceptionHandler mDefaultHandler;
	/** CrashHandler实例 */
	private static PhoneCrashHandler INSTANCE;
	
	/** 使用Properties来保存设备的信息和错误堆栈信息 
	private Properties mDeviceCrashInfo = new Properties();
	*/
    
	/** 保证只有一个CrashHandler实例 */
	private PhoneCrashHandler() {
	}

	/** 获取CrashHandler实例 ,单例模式 */
	public static PhoneCrashHandler getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new PhoneCrashHandler();
		}
		return INSTANCE;
	}

	/**
	 * 初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器
	 * 
	 * @param ctx
	 */
	public void init(Context ctx) {
		mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
		Thread.setDefaultUncaughtExceptionHandler(this);
	}
	
	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		// TODO Auto-generated method stub
		if (!handleException(ex) && mDefaultHandler != null) {
			// 如果用户没有处理则让系统默认的异常处理器来处理
			mDefaultHandler.uncaughtException(thread, ex);
		} else {
			// Sleep一会后结束程序
			try {
				Thread.sleep(20000);
			} catch (InterruptedException e) {

			}
			android.os.Process.killProcess(android.os.Process.myPid());
			System.exit(10);
		}
	}

	/**
	 * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑
	 * 
	 * @param ex
	 * @return true:如果处理了该异常信息;否则返回false
	 */
	private boolean handleException(Throwable ex) {
		if (ex == null) {
			return false;
		}
		
		FileUtil.addLog("Application Error", PhoneCrashHandler.class, "Application", ex);
		return false;
	}

	/**
	 * 收集程序崩溃的设备信息
	 * 
	 * @param ctx
	 */
	public void collectCrashDeviceInfo(Context ctx, Exception error) {
//		String errorString = "";
//		try {
//			PackageManager pm = ctx.getPackageManager();
//			PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES);
//			if (pi != null) {
//				errorString = VERSION_NAME + ":" + pi.versionName + "\r\n" + VERSION_CODE + ":" + pi.versionCode;
//			}
//		} catch (NameNotFoundException e) {
//			
//		}
		// 使用反射来收集设备信息.在Build类中包含各种设备信息,
		// 例如: 系统版本号,设备生产商 等帮助调试程序的有用信息
//		Field[] fields = Build.class.getDeclaredFields();
//		for (Field field : fields) {
//			try {
//				field.setAccessible(true);
//				errorString += field.getName() + field.get(null) + "\r\n";
//			} catch (Exception e) {
//				
//			}
//		}
		
	}
}
